package com.iatinspur.learn;



import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


/**
 * 24集 讲解 字符串常量
 *   这里之说jdk1.8 运行时常量池在元空间  字符串常量池在堆中
 *   new 的String对象其实也在堆中，但是他不在字符串常量池里面
 *
 */
public class Learn_21_JVM {


    public  static Map<String,String> map=new HashMap<String,String>(){
        {
            this.put("123","123");
        }
    };



    public static void main(String[] args) throws IOException {
        mytest7();
    }

    private static void mytest() {
        String  a = new String("abc");
        String  b = "abc";
        String  c = "abc";

        System.out.println(a==b);
        System.out.println(c==b);
        System.out.println(System.identityHashCode(a));
        System.out.println(System.identityHashCode(b));
        System.out.println(System.identityHashCode(c));
    }


    private static void mytest2() {
        String a = "a";
        String b = "b";
        String c = "ab";
        String d= a+b;

        System.out.println(c==d);
        System.out.println(System.identityHashCode(c));
        System.out.println(System.identityHashCode(d));
    }



    private static void mytest3() {
        String a = "a";
        String b = "b";
        String c = "ab";
        String d="a"+"b";

        System.out.println(c==d);
        System.out.println(System.identityHashCode(c));
        System.out.println(System.identityHashCode(d));
    }


    /**
     * intern() 就是把数据丢到常量池中
     * new String("abc") 不在常量池 intern()进了常量池
     * 那么 b==a 就是true
     */
    private static void mytest4() {
        String  a = new String("abc").intern();
        String  b = "abc";
        System.out.println(a==b);
    }


    /**
     *
     */
    private static void mytest5() {
        String  a = new String("abc").intern();
        String  b = "abc";
        System.out.println(a==b);
    }


    /**
     * 根据
     */
    private static void mytest6() {
        String  a = new String("123");
        map.get(a);
        System.out.println(a==map.get(a));
    }





    /**
     * 因为第一个 think123  字符串常量池没有 intern 就把字符串地址丢到 常量池中  所以true
     *
     * 第二个 java  在常量池中就是有的， intern 就会更换指针  所以第二个为false
     */
    private static void mytest7() {
       String  s1 = new  StringBuilder().append("think").append("123").toString();

       System.out.println(s1 == s1.intern());


       String  s2 = new  StringBuilder().append("ja").append("va").toString();


       System.out.println(s2 == s2.intern());

    }


}








